/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Jomas
 */
public class declaracaoPonteiros {

    private TabelaSimbolos tabelaSimbolos;

    public declaracaoPonteiros(TabelaSimbolos tabelaSimbolos)
    {
        this.tabelaSimbolos = tabelaSimbolos;
    }

    public boolean  declaraPonteiros()
    {

        if(Tipos.apenasCompara(tabelaSimbolos))
            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
        else
        {
            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),"Erro na linha "+ tabelaSimbolos.getLinha()+  " Não é um Tipo válido");
            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false;
        }
        if(tabelaSimbolos.getLookahead().equals("*") )
            tabelaSimbolos.reconhecer("*");
        else
        {
            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),"Erro na linha "+ tabelaSimbolos.getLinha()+  " Faltou o *");
            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false;
        }

        while(tabelaSimbolos.getLookahead().equals("*"))
            tabelaSimbolos.reconhecer("*");

        if(tabelaSimbolos.getTipo().equals("identificador"))
            tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
        else
        {
            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),"Erro na linha "+ tabelaSimbolos.getLinha()+  "Deveria ser um identificador");
            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false;
        }

        if(tabelaSimbolos.getLookahead().equals(";"))
        {
            tabelaSimbolos.reconhecer(";");
            return true;
        }
        else if(tabelaSimbolos.getLookahead().equals(","))
        {
            while (tabelaSimbolos.getLookahead().equals(","))
            {
                tabelaSimbolos.reconhecer(",");
                if(tabelaSimbolos.getLookahead().equals("*"))
                    tabelaSimbolos.reconhecer("*");
                else
                {
                    ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),"Erro na linha "+ tabelaSimbolos.getLinha()+  "Deveria vir um *");
                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false;
                }

                while (tabelaSimbolos.getLookahead().equals("*"))
                    tabelaSimbolos.reconhecer("*");

                if (tabelaSimbolos.getTipo().equals("identificador"))
                    tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                else
                {
                    ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),"Erro na linha "+ tabelaSimbolos.getLinha()+  "Deveria ser um identificador");
                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false;
                }

                if (tabelaSimbolos.getLookahead().equals(";"))
                {
                    tabelaSimbolos.reconhecer(";");
                    return true;
                }
            }
        }
        else
        {
            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(),"Erro na linha "+ tabelaSimbolos.getLinha()+  "Falta uma , ou um ;");
            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false;
        }

        return true;
    }
}
